//路由鉴权：项目中路由能不能被访问的权限设置
import router from '@/router';
import setting from './setting';
import nprogress from 'nprogress';
//引入进度条样式
import 'nprogress/nprogress.css';
nprogress.configure({ showSpinner: false });//去除加载圈
//获取用户相关的小仓库内部token数据，去判断用户是否登录成功
import useUserStore from './store/modules/user';
import pinia from './store';
let userStore = useUserStore(pinia);

//全局守卫：项目当中任意路由切换都会触发的钩子
//全局前置守卫
router.beforeEach(async (to: any, from: any, next: any) => {
    document.title = `${setting.title} - ${to.meta.title} `;
    //to:你将要访问哪个路由
    //from:你从哪个路由而来
    //next：路由的放行函数
    nprogress.start();
    //获取token，去判断用户是否登录
    let token = userStore.token;
    //获取用户的名字
    let username = userStore.username;
    //用户登录判断
    if (token) {
        if (to.path == '/login') {
            next({ path: '/' })//登录了去登录页，导去首页
        } else {//登录成功去其他页放行
            //有用户信息
            if (username) {
                next();//放行
            } else {//如果没有用户信息，在守卫这里发请求获取到了用户信息再放行
                try {
                    //获取用户信息
                    await userStore.userInfo();
                    //万一：刷新的时候是异步路由，有可能获取到用户信息，异步路由还没有加载完毕，出现空白的效果
                    next({ ...to });//放行
                } catch (error) {
                    //token过期：获取不到用户信息了
                    //用户手动修改本地存储token
                    //退出登录->用户相关的数据清空
                    await userStore.userLogout();//等用户退出登录成功以后再执行下一步
                    next({ path: '/login', query: { redirect: to.path } })
                }
            }
        }
    } else {
        //用户未登录判断
        if (to.path == '/login') {
            next();//未登录去登录页放行
        } else {//未登录去其他页转到登录页且带query
            next({ path: '/login', query: { redirect: to.path } });
        }
    }

})

//全局后置守卫
router.afterEach((to: any, from: any) => {
    nprogress.done();
})
//第一个问题：任意路由切换实现进度条业务 ---nprogress
//第二个问题：路由鉴权（路由组件的访问权限的设置）
//全部路由组件：登录|404|任意路由|首页|数据大屏|权限管理（三个子路由）|商品管理（四个子路由）

//用户未登录：可以访问login，其余六个路由不能访问（指向login）
//用户登录成功：不可以访问login（指向首页），其余的路由可以访问